package com.xinz.srmi;

import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.List;
/**
 * 远程调用本地接口实现的过滤器
 * @author xingyun
 *
 */
public interface NativeInvokFilter{
	/**
	 * 在准备调用本地接口之前调用，可以在过滤时候修改method的某项参数达到过滤的效果
	 * @param methodIndex
	 * @param method
	 */
	void readyInvok( NativeMethod method);
	/**
	 * 在调用本地方法出现异常的时候调用，用于转换实现成抛出的异常
	 * @param methodIndex
	 * @param method 
	 * @param e 有本地方法返回的异常
	 * @return 返回到客户端的异常
	 */
	InvocationTargetException invokException(NativeMethod method, InvocationTargetException e);
	/**
	 * 在调用本地方法成功的时候调用，也可以抛出异常给客户端
	 * @param methodIndex
	 * @param method
	 */
	void invokSuccess(NativeMethod method);
	
	
	public static  class Abstract implements NativeInvokFilter{

		@Override
		public void readyInvok(NativeMethod method) {
			
		}

		@Override
		public InvocationTargetException invokException(NativeMethod method, InvocationTargetException e) {
			return e;
		}

		@Override
		public void invokSuccess(NativeMethod method) {
			
		}
		
	}
	
	public static class ListFilter implements NativeInvokFilter{
		List<NativeInvokFilter> filters = new ArrayList<NativeInvokFilter>();
		public void invokSuccess(NativeMethod method) {
			for(int i=0;i<filters.size();i++){
				filters.get(i).invokSuccess(method);
			}
		}

		public InvocationTargetException invokException(NativeMethod method, InvocationTargetException e) {
			for(int i=0;i<filters.size();i++){
				e=filters.get(i).invokException(method, e);
			}
			return e;
		}

		public void readyInvok( NativeMethod method) {
			for(int i=0;i<filters.size();i++){
				filters.get(i).readyInvok(method);
			}
		}

		public void add(NativeInvokFilter filter) {
			filters.add(filter);
		}
	}

	
	
	
}